Python 从子进程的stdout和stderr分别读取,同时保持顺序

您所在的位置:网站首页 js readline 读取字符串长度 Python 从子进程的stdout和stderr分别读取,同时保持顺序

Python 从子进程的stdout和stderr分别读取,同时保持顺序

2024-05-31 04:29| 来源: 网络整理| 查看: 265

Python 从子进程的stdout和stderr分别读取,同时保持顺序

在本文中,我们将介绍如何在Python中从子进程的标准输出(stdout)和标准错误(stderr)分别读取数据,并且保持它们的顺序。

阅读更多:Python 教程

1. 使用subprocess模块创建子进程

要从子进程的stdout和stderr中读取数据,首先需要创建一个子进程。在Python中,我们可以使用subprocess模块来执行外部命令。下面是一个简单的示例:

import subprocess # 执行外部命令 command = ["ls", "-l"] process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # 等待子进程完成 output, error = process.communicate() # 输出结果 print("输出结果:") print(output.decode()) print("错误信息:") print(error.decode())

在上面的示例中,我们使用subprocess.Popen函数创建一个子进程,并将其标准输出设为subprocess.PIPE,标准错误设为subprocess.PIPE。然后使用process.communicate()方法来等待子进程完成,并获取其输出结果和错误信息。

2. 从stdout和stderr分别读取数据

在上述示例中,我们使用process.communicate()方法同时获取了子进程的标准输出和标准错误。但是,有时我们需要分别处理stdout和stderr的数据,并且保持它们的顺序。下面是一个示例:

import subprocess # 执行外部命令 command = ["ls", "-l"] process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) # 逐行读取stdout和stderr的数据 stdout_lines = [] stderr_lines = [] while True: line = process.stdout.readline() if line == '' and process.poll() is not None: break if line: stdout_lines.append(line.strip()) while True: line = process.stderr.readline() if line == '' and process.poll() is not None: break if line: stderr_lines.append(line.strip()) # 输出结果 print("标准输出结果:") for line in stdout_lines: print(line) print("标准错误信息:") for line in stderr_lines: print(line)

在上面的示例中,我们使用process.stdout.readline()和process.stderr.readline()方法分别逐行读取子进程的标准输出和标准错误。注意,我们需要使用universal_newlines=True来指定输出数据的编码方式为文本模式。

3. 保持数据的顺序

当从子进程的stdout和stderr分别读取数据时,我们需要保持数据的顺序。上述示例中,我们使用了两个循环分别读取stdout和stderr的数据,并将其添加到对应的列表中。

但是,由于stdout和stderr是异步的,可能会交错输出。为了保持数据的顺序,我们可以使用subprocess.PIPE的communicate()方法和subprocess.STDOUT常量将stdout和stderr合并为一个流。下面是一个示例:

import subprocess # 执行外部命令 command = ["ls", "-l"] process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True) # 逐行读取合并后的输出流 output_lines = [] while True: line = process.stdout.readline() if line == '' and process.poll() is not None: break if line: output_lines.append(line.strip()) # 输出结果 print("输出结果:") for line in output_lines: print(line)

在上面的示例中,我们使用了subprocess.PIPE的communicate()方法将stdout和stderr合并为一个输出流,并使用process.stdout.readline()方法逐行读取输出流的数据。由于合并后的输出流保持了顺序,我们可以方便地逐行处理数据。

总结

本文介绍了如何在Python中从子进程的stdout和stderr分别读取数据,并且保持它们的顺序。我们使用了subprocess模块来创建子进程,通过设置标准输出和标准错误为subprocess.PIPE来获取对应的数据。

为了保持数据的顺序,我们可以分别读取stdout和stderr的数据,并将其存储到各自的列表中。另外,我们还介绍了一种合并stdout和stderr的方法,通过subprocess.PIPE的communicate()方法和subprocess.STDOUT常量实现。

希望本文对你理解Python中如何从子进程的stdout和stderr分别读取数据有所帮助。如有疑问,请随时留言。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3